package chapter08

/**
  *
  * @author Pop
  * @date 2022/7/4 22:11
  */
object Test01_PatternMatchBase {

  def main(args: Array[String]): Unit = {
    /**
      * 基本定义语法。类似java的 switch case
      */
    val x:Int = 2
    val y:String = x match{
      case 1 => "one"
      case 2=> "two"
      case 3=> "three"
      case _ =>"other"
    }

    // 用模式匹配实现简单二元运算
    val a = 25
    val b = 13

    def matchDualOp(op:Char): Int = op match {
      case '+' => a+b
      case '-' => a-b
      case '*' => a*b
      case '/' => a/b
      case '%' => a%b
      case _ => -1

    }
    println(matchDualOp('+'))

    /*
    * 如果所有的case 都不匹配，那么会执行 case _ 分支，类似Java中的default语句
    * 若此时没有case _分支，那么会抛出MathError
    *
    *
    * 每个case中，不需要使用break 语句，自动中断case
    *
    * match case 语句可以匹配任何类型，而不只是字面量
    *
    * => 后面的代码块，知道下一个case 语句之前的代码都是作为一个整体执行，可以
    * 使用 {} 括起来，也可以不括
    * */


    // 模式守卫,不明确类型, 会将匹配的值赋给一个局部变量，写if判断

    def abs(num:Int):Int = {
      num match {
        case i if i >=0 =>i
        case i if i<0 => -i
      }
    }

    println(abs(67))
  }

}
